home *** CD-ROM | disk | FTP | other *** search
/ PC World 2008 September / PCWorld_2008-09_cd.bin / v cisle / sadanastroju / greasemonkey-0.8.20080609.0-fx.xpi / chrome / greasemonkey.jar / chromeFiles / content / prefmanager.js < prev    next >
Text File  |  2008-06-09  |  4KB  |  144 lines

  1. var GM_prefRoot = new GM_PrefManager();
  2.  
  3. GM_PrefManager.MIN_INT_32 = -0x80000000;
  4. GM_PrefManager.MAX_INT_32 = 0x7FFFFFFF;
  5.  
  6. /**
  7.  * Simple API on top of preferences for greasemonkey.
  8.  * Construct an instance by passing the startPoint of a preferences subtree.
  9.  * "greasemonkey." prefix is assumed.
  10.  */
  11. function GM_PrefManager(startPoint) {
  12.   if (!startPoint) {
  13.     startPoint = "";
  14.   }
  15.  
  16.   startPoint = "greasemonkey." + startPoint;
  17.  
  18.   var pref = Components.classes["@mozilla.org/preferences-service;1"]
  19.                        .getService(Components.interfaces.nsIPrefService)
  20.                        .getBranch(startPoint);
  21.  
  22.   var observers = {};
  23.   const nsISupportsString = Components.interfaces.nsISupportsString;
  24.  
  25.   /**
  26.    * whether a preference exists
  27.    */
  28.   this.exists = function(prefName) {
  29.     return pref.getPrefType(prefName) != 0;
  30.   };
  31.  
  32.   /**
  33.    * returns the named preference, or defaultValue if it does not exist
  34.    */
  35.   this.getValue = function(prefName, defaultValue) {
  36.     var prefType = pref.getPrefType(prefName);
  37.  
  38.     // underlying preferences object throws an exception if pref doesn't exist
  39.     if (prefType == pref.PREF_INVALID) {
  40.       return defaultValue;
  41.     }
  42.  
  43.     try {
  44.       switch (prefType) {
  45.         case pref.PREF_STRING:
  46.           return pref.getComplexValue(prefName, nsISupportsString).data;
  47.         case pref.PREF_BOOL:
  48.           return pref.getBoolPref(prefName);
  49.         case pref.PREF_INT:
  50.           return pref.getIntPref(prefName);
  51.       }
  52.     } catch(ex) {
  53.       return defaultValue != undefined ? defaultValue : null;
  54.     }
  55.     return null;
  56.   };
  57.  
  58.   /**
  59.    * sets the named preference to the specified value. values must be strings,
  60.    * booleans, or integers.
  61.    */
  62.   this.setValue = function(prefName, value) {
  63.     var prefType = typeof(value);
  64.     var goodType = false;
  65.  
  66.     switch (prefType) {
  67.       case "string":
  68.       case "boolean":
  69.         goodType = true;
  70.         break;
  71.       case "number":
  72.         if (value % 1 == 0 &&
  73.             value >= GM_PrefManager.MIN_INT_32 &&
  74.             value <= GM_PrefManager.MAX_INT_32) {
  75.           goodType = true;
  76.         }
  77.         break;
  78.     }
  79.  
  80.     if (!goodType) {
  81.       throw new Error("Unsupported type for GM_setValue. Supported types " +
  82.                       "are: string, bool, and 32 bit integers.");
  83.     }
  84.  
  85.     // underlying preferences object throws an exception if new pref has a
  86.     // different type than old one. i think we should not do this, so delete
  87.     // old pref first if this is the case.
  88.     if (this.exists(prefName) && prefType != typeof(this.getValue(prefName))) {
  89.       this.remove(prefName);
  90.     }
  91.  
  92.     // set new value using correct method
  93.     switch (prefType) {
  94.       case "string":
  95.         var str = Components.classes["@mozilla.org/supports-string;1"]
  96.                             .createInstance(nsISupportsString);
  97.         str.data = value;
  98.         pref.setComplexValue(prefName, nsISupportsString, str);
  99.         break;
  100.       case "boolean":
  101.         pref.setBoolPref(prefName, value);
  102.         break;
  103.       case "number":
  104.         pref.setIntPref(prefName, Math.floor(value));
  105.         break;
  106.     }
  107.   };
  108.  
  109.   /**
  110.    * deletes the named preference or subtree
  111.    */
  112.   this.remove = function(prefName) {
  113.     pref.deleteBranch(prefName);
  114.   };
  115.  
  116.   /**
  117.    * call a function whenever the named preference subtree changes
  118.    */
  119.   this.watch = function(prefName, watcher) {
  120.     // construct an observer
  121.     var observer = {
  122.       observe:function(subject, topic, prefName) {
  123.         watcher(prefName);
  124.       }
  125.     };
  126.  
  127.     // store the observer in case we need to remove it later
  128.     observers[watcher] = observer;
  129.  
  130.     pref.QueryInterface(Components.interfaces.nsIPrefBranchInternal).
  131.       addObserver(prefName, observer, false);
  132.   };
  133.  
  134.   /**
  135.    * stop watching
  136.    */
  137.   this.unwatch = function(prefName, watcher) {
  138.     if (observers[watcher]) {
  139.       pref.QueryInterface(Components.interfaces.nsIPrefBranchInternal).
  140.         removeObserver(prefName, observers[watcher]);
  141.     }
  142.   };
  143. }
  144.